package 对象之继承.demo02;

/*多态关系中，成员变量是不涉及重写的
 *
 *
 * 多态关系中使用成员变量，遵循编译看左，运行看右
 * 编译看左：是在编译期间会看左边的类型有没有这个成员，没有就报错，有就不报错
 * 运行看左：是在运行期间使用的是 左边的类型中这个成员 * * * * * */
public class text {
    public static void main(String[] args) {
        //通过多态的方式创建对象，然后测式成员变量的使用
        //多态：父类引用指向子类
        //通过多态创建对象，调用子类成员
        Animal an = new Dog();
        System.out.println(an.name);

        //调用eat()方法
        an.eat();//狗吃骨头

        //调用watch()方法，属于子类独有的方法
        //an.watch() 父类引用不能使用子类的特有成员

        //正确写法
        //Dog dog =(Dog) an;//向下转型
        //dog.watch();

        //不正常的转换
        //Cat c =(Cat)an;

        //优化后：判断当前对象是否是Dog类对象，如果是，在调用watch()方法
        if (an instanceof Dog) {//判断an是否是Dog类的对象
            //能不能到这里，说明条件满足
            Dog dog = (Dog) an;
            dog.watch();


        }

        //通过普通方式创建对象，然后测试
        Dog dog = new Dog();
        System.out.println(dog.name);


    }
}
/*
 * 多态的好处
 *   可维护性
 *   可扩展性
 * 多态的弊端
 *   父类引用不能使用子类的特有成员
 *
 * 解决方案
 *
 * 通过类型转换实现
 * 注意
 * 只能在继承层次内进行转换，否则会报ClassCastException异常
 * 将父类对象转成子类前，使用instanceof进行检查
 * instanceof关键字的用法
 * 对象名instanceof数据类型
 * 意思是判断前边的对象是否是后边的数据类型
 * * * * * * * * * * * * * * * * * */